import axios, { type AxiosResponse } from "axios";
import { ElMessage, ElMessageBox } from "element-plus";
import pinia from "@/stores/index";
import { useUserStore } from "@/stores/user";

// console.log(import.meta.env);
const service = axios.create({
  //import.meta.env  开发模式VITE_API_URL就是env.development中的VITE_API_URL的值
  //运行build命令打包的时候,自动读取env.production中的VITE_API_URL的值
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 3000,
  // 不要在这里放置设置 headers 中的 token，因为token也许在首次进入的不存在，后续登录以后又有了，但是这个地方的代码是不会再次执行，除非用户刷新了页面获重新进入应用，我们需要在每次发送请求的时候都要去看下是否存在 token，所以设置 token 头的任务应该在 请求拦截器中 去做更合适
  //   headers: {
  // 	token: ''
  //   }
});
/**
 * 注册指定的函数把他们放在每次请求发出之前去执行
 * 这个通过 use 注册的函数，会在每次请求之前调用
 * 调用的时候还会通过函数的第一个参数传入当前这次请求的相关数据
 * 我们需要在这个函数调用 return，且return 的是当前这次请求的数据相关的对象（config）
 * 可以让我们在这里对请求相关的参数进行最后（统一）的处理
 */

service.interceptors.request.use(function (config) {
  // 获取到 user 仓库
  const userStore = useUserStore(pinia);
  // config: 当前这一次请求的信息
  //   config.headers = {
  //     token: "..",
  //   };
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  // @ts-ignore 表示下面一行不使用 ts 来进行检测了（只管一行）
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  // @ts-ignore
  config.headers.token = userStore.token;
  //   console.log("请求拦截器注册的函数被调用了", config);
  return config;
});

service.interceptors.response.use(
  function (res) {
    // 对业务出现的错误进行统一的处理
    if (res.data.code === 20000 || res.data.code === 200) {
      // 业务正确
      // 我们可以在这里对默认返回的数据，进行二次加工处理，让返回
      return res.data.data;
    } else {
      //业务错误

      ElMessage.error(res.data.message);
      return Promise.reject(res.data);
    }
  },
  // 处理请求的错误（http）
  function (e) {
    console.log("请求错误：", e);
    ElMessage.error("请求错误");
    return Promise.reject(e);
  }
);
export default service;
